// PageProcessor.h
#pragma once
#include <string>
#include <vector>
#include <set>

#include "cppjieba/Jieba.hpp"
#include "simhash/Simhasher.hpp"
#include "tinyxml2.h" // 添加这个

class PageProcessor
{
public:
    PageProcessor();
    void process(const std::string &dir);

public:
    void extract_documents(const std::string &dir);
    void deduplicate_documents();
    void build_pages_and_offsets(const std::string &pages, const std::string &offsets);
    void build_inverted_index(const std::string &filename);

private:
    void load_stopwords(const std::string &filename, std::set<std::string> &stopwords);
    // 验证生成的文件的辅助函数
    void verify_generated_files(const std::string &pages, const std::string &offsets, int expected_count);
    // HTML处理相关函数
    std::string removeHtmlTags(const std::string &html);
    std::string removeHtmlTagsSimple(const std::string &html);
    std::string normalizeWhitespace(const std::string &text);
    // 倒排索引相关函数
    void show_inverted_index_stats();
    // 关键词验证函数
    bool isValidKeyword(const std::string &word);
    // 中文处理相关函数
    bool isChineseChar(char32_t c);
    bool isChineseWord(const std::string &word);
    bool isValidChineseKeyword(const std::string &word);
    bool isPureChineseWord(const std::string &word); // 新增
    void debug_tokenize(const std::string &content); // 调试用
private:
    struct Document
    {
        int id;
        std::string link;
        std::string title;
        std::string content;
    };

private:
    cppjieba::Jieba m_tokenizer;
    simhash::Simhasher m_hasher;
    std::set<std::string> m_stopWords; // 使用set, 而非vector, 是为了方便查找
    std::vector<Document> m_documents;
    std::map<std::string, std::map<int, double>> m_invertedIndex;
};